package ar.edu.caece.compiler.grammar.factories;

import ar.edu.caece.compiler.grammar.AbstractTokenVisitorFactory;
import ar.edu.caece.compiler.grammar.GrammarSymbol;
import ar.edu.caece.compiler.grammar.ParsingException;
import ar.edu.caece.compiler.grammar.TokenVisitorInterface;
import ar.edu.caece.compiler.grammar.nonterminals.NOMBREP1;
import ar.edu.caece.compiler.grammar.terminals.GrammarTerminal;
import ar.edu.caece.compiler.grammar.terminals.IdentifierToken;

public class NOMBREP1Factory extends AbstractTokenVisitorFactory {

	private static NOMBREP1Factory INSTANCE;
	
	public static NOMBREP1Factory getInstance() {
		if(INSTANCE==null) INSTANCE = new NOMBREP1Factory();
		return INSTANCE;
	}
	
	private NOMBREP1Factory() {
		
	}
	
	@Override
	public TokenVisitorInterface makeChainedVisitor(
			final TokenVisitorInterface siguiente) throws Exception {
		return new IdentifierToken.IdentifierChainVisitor(siguiente) {
			
			@Override
			public GrammarSymbol identifierCase(IdentifierToken llamador) {
				return new NOMBREP1(llamador);
			}
		};
	
	}
	@Override
	public TokenVisitorInterface makeVisitor() throws Exception {
		return new IdentifierToken.IdentifierTokenVisitor() {
			
			@Override
			public GrammarSymbol defaultCase(GrammarTerminal llamador) throws Exception {
				throw new ParsingException("Error de parsing.",NOMBREP1.class,llamador);
			}
			
			@Override
			public GrammarSymbol identifierCase(IdentifierToken llamador) {
				return new NOMBREP1(llamador);
			}
		};
	}
	
	
}
